package cn.ml.lambda;

public class LambdaDemo2 {
    //3、静态内部类
    static class LoveImpl2 implements Love{
        @Override
        public void love(String a) {
            System.out.println("i love " + a);
        }
    }
    public static void main(String[] args) {
        Love loveDao = new LoveImpl();
        loveDao.love("实现类111");

        loveDao = new LoveImpl2();
        loveDao.love("静态内部类222");
        //4、局部内部类
        class LoveImpl3 implements Love{
            @Override
            public void love(String a) {
                System.out.println("i love " + a);
            }
        }
        loveDao = new LoveImpl3();
        loveDao.love("kk局部内部类333");
        //5、匿名内部类（没有类名称）,必须借助接口或父类
        loveDao = new Love() {
            @Override
            public void love(String a) {
                System.out.println("i love " + a);
            }
        };
        loveDao.love("匿名内部类444");

        //6、使用lambda简化(只要接口中方法)
        loveDao = (String a)->{
            System.out.println("i love " + a);
        };
        loveDao.love("lambda555-带参数类型");
        loveDao = (a)->{
            System.out.println("i love " + a);
        };
        loveDao.love("lambda555-不带参数类型");
        loveDao = a->{
            System.out.println("i love " + a);
        };
        loveDao.love("lambda555-不带括号");

        //只有一行代码情况下才能简化为不带大括号，如果多行需加代码块（大括号）
        Love foo = a->System.out.println("i love " + a);
        foo.love("lambda555-不带大括号");
    }
}

//1、定义一个函数式接口：接口中只有一个方法
interface Love{
    void love(String a);
}

//2、实现类
class LoveImpl implements Love{
    @Override
    public void love(String a) {
        System.out.println("i love " + a);
    }
}